home *** CD-ROM | disk | FTP | other *** search
/ Mac Mania 6 / MacMania 6.toast / / Tools&Utilities / TouchMe 1.2□ / touchMe 1.2 Folder / touchMe source codes / CW11 PP source / source / Common Lib / CPrefsFile.cp < prev    next >
Encoding:
Text File  |  1997-04-25  |  6.6 KB  |  278 lines  |  [TEXT/CWIE]

  1. // ==================================================
  2. //    CPrefsFile.cp
  3. //    Copyright (C) 1996-1997 Mizutori Tetsuya
  4. //    July 4 ,1996; February 3, 1997; March 14, 1997.
  5. // ==================================================
  6. //    All documents are pretty-printed in 10-point Geneva font.
  7.  
  8. #pragma once
  9.  
  10. #include <UMemoryMgr.h>
  11. //#include <UResourceMgr.h>
  12. //#include <LString.h>
  13.  
  14. #include "CPrefsFile.h"
  15.  
  16.  
  17. const    OSType    kPrefType        = 'pref';
  18. const    OSType    kPrefCreator    = 'MzTm';
  19. const    ResType    PREF_ResType    = 'PREF';
  20. const    ResIDT    PREF_ResID    = 1000;
  21.  
  22.  
  23. #ifdef COMMENT
  24.  
  25. // It is strongly recommended to align pref structure in 4-byte.
  26.  
  27. // For example:
  28. // struct {
  29. //    Int16    year,
  30. //    Int16    month,
  31. //    Int16    day,
  32. //    Int16    dummy,    // This field is for fill-alignment for 4-byte.
  33. //    Uint32    datetime
  34. // }
  35.  
  36. // TMPL:
  37. //    DWRD    year
  38. //    DWRD    month
  39. //    DWRD    day
  40. //    FLNG        dummy    // This field is for fill-alignment for 4-byte.
  41. //    DLNG        datetime
  42.  
  43. #endif // COMMENT
  44.  
  45. // --------------------------------------------------
  46. //        • CPrefsFile()
  47. // --------------------------------------------------
  48.  
  49. CPrefsFile::CPrefsFile()
  50. {
  51.     SetupConstants();
  52. }
  53.  
  54.  
  55. // --------------------------------------------------
  56. //        • CPrefsFile()
  57. // --------------------------------------------------
  58.  
  59. CPrefsFile::CPrefsFile(
  60.     ConstStr255Param    inFileName,
  61.     OSType            inPrefFileCreator )
  62.         : LPreferencesFile( inFileName, false )
  63. {
  64.     SetupConstants();
  65.  
  66.     mPrefFileCreator = inPrefFileCreator;
  67. }
  68.  
  69.  
  70. // --------------------------------------------------
  71. //        • ~CPrefsFile
  72. // --------------------------------------------------
  73.  
  74. CPrefsFile::~CPrefsFile()
  75. {
  76. }
  77.  
  78.  
  79. // ==================================================
  80. //    Member functions (handle member variables)
  81. // ==================================================
  82.  
  83. // --------------------------------------------------
  84. //        • SetupConstants
  85. // --------------------------------------------------
  86.  
  87. void
  88. CPrefsFile::SetupConstants( void )
  89. {
  90.     mPrefFileType        = kPrefType;
  91.     mPrefFileCreator    = kPrefCreator;
  92.     mPrefResType        = PREF_ResType;
  93.     mPrefResID        = PREF_ResID;
  94. }
  95.  
  96.  
  97. // --------------------------------------------------
  98. //        • SetupFileInfo
  99. // --------------------------------------------------
  100.  
  101. void
  102. CPrefsFile::SetupFileInfo(
  103.     OSType    inPrefFileType,
  104.     OSType    inPrefFileCreator )
  105. {
  106.     mPrefFileType        = inPrefFileType;
  107.     mPrefFileCreator    = inPrefFileCreator;
  108. }
  109.  
  110.  
  111. // --------------------------------------------------
  112. //        • SetupResType
  113. // --------------------------------------------------
  114.  
  115. void
  116. CPrefsFile::SetupResType(
  117.     ResType    inPrefResType,
  118.     ResIDT    inPrefResID )
  119. {
  120.     mPrefResType        = inPrefResType;
  121.     mPrefResID        = inPrefResID;
  122. }
  123.  
  124.  
  125. // ==================================================
  126. //    Member functions (read or write preferences settings)
  127. // ==================================================
  128.  
  129. // --------------------------------------------------
  130. //        • LoadPrefs
  131. // --------------------------------------------------
  132.  
  133. OSErr
  134. CPrefsFile::LoadPrefs(
  135.     long &    outBlockDataLen,
  136.     Handle    outBlockDataH )
  137. {
  138.     return LoadPrefs( outBlockDataLen, outBlockDataH, mPrefResType, mPrefResID );
  139. }
  140.  
  141.  
  142. OSErr
  143. CPrefsFile::LoadPrefs(
  144.     long &    outBlockDataLen,
  145.     Handle    outBlockDataH,
  146.     ResType    inPrefResType,
  147.     ResIDT    inPrefResID )
  148. {
  149.     outBlockDataLen = 0;
  150.  
  151.     OSErr    err = noErr;
  152.  
  153.     short        vRefNum;
  154.     vRefNum = OpenOrCreateResourceFork( fsRdWrPerm,
  155.                 mPrefFileCreator, mPrefFileType, smSystemScript );
  156.  
  157.     short        curResFile = ::CurResFile();
  158.     ::UseResFile( vRefNum );
  159.  
  160.     Handle    resHandle = ::Get1Resource( inPrefResType, inPrefResID );
  161.  
  162.     if ( resHandle != NULL ) {
  163.  
  164.         // Read preferences data from the Prefs file.
  165.         long        resSize = ::GetHandleSize( resHandle );
  166.     //    if ( ioByteSize > resSize ) ioByteSize = resSize;
  167.         outBlockDataLen = resSize;
  168.         ::SetHandleSize( outBlockDataH, outBlockDataLen );
  169.         ThrowIfOSErr_( ::MemError() );
  170.         ::BlockMoveData( (void *) *resHandle, (void *) *outBlockDataH, outBlockDataLen );
  171.         ::ReleaseResource( resHandle );
  172.  
  173.     } else {
  174.  
  175.         // Read default preferences from this application file, if Prefs file is empty.
  176.         ::UseResFile( curResFile );
  177.         Handle    theHandle = ::GetResource( inPrefResType, inPrefResID );
  178.         if ( theHandle != NULL ) {
  179.             long        resSize = ::GetHandleSize( theHandle );
  180.         //    if ( ioByteSize > resSize ) ioByteSize = resSize;
  181.             outBlockDataLen = resSize;
  182.             ::SetHandleSize( outBlockDataH, outBlockDataLen );
  183.             ThrowIfOSErr_( ::MemError() );
  184.             ::BlockMoveData( (Ptr) *theHandle, (Ptr) *outBlockDataH, outBlockDataLen );
  185.             ::ReleaseResource( theHandle );
  186.         } else {
  187.             err = resNotFound;
  188.         }
  189.  
  190.     }
  191.  
  192.     ::UseResFile( curResFile );
  193.     CloseResourceFork();
  194.  
  195.     return err;
  196. }
  197.  
  198.  
  199. // --------------------------------------------------
  200. //        • SavePrefs
  201. // --------------------------------------------------
  202.  
  203. OSErr
  204. CPrefsFile::SavePrefs(
  205.     long        inBlockDataLen,
  206.     Handle    inBlockDataH )
  207. {
  208.     return SavePrefs( inBlockDataLen, inBlockDataH, mPrefResType, mPrefResID );
  209. }
  210.  
  211.  
  212. OSErr
  213. CPrefsFile::SavePrefs(
  214.     long        inBlockDataLen,
  215.     Handle    inBlockDataH,
  216.     ResType    inPrefResType,
  217.     ResIDT    inPrefResID )
  218. {
  219.     OSErr    err = noErr;
  220.  
  221.     short        vRefNum;
  222.     vRefNum = OpenOrCreateResourceFork( fsRdWrPerm,
  223.                 mPrefFileCreator, mPrefFileType, smSystemScript );
  224.  
  225.     short        curResFile = ::CurResFile();
  226.     ::UseResFile( vRefNum );
  227.  
  228.     Handle    resHandle = ::Get1Resource( inPrefResType, inPrefResID );
  229.  
  230.     // Remove the existing PREF resource.
  231.     if ( resHandle != NULL ) {
  232.  
  233.         // If no changes, then do not touch the resource.
  234.         if ( inBlockDataLen > 0 &&
  235.             BlocksAreEqual( (void *)*inBlockDataH, (void *) *resHandle, inBlockDataLen ) ) {
  236.                 ::ReleaseResource( resHandle );
  237.                 goto out; }
  238.     //    Boolean    theSame = true;
  239.     //    for ( long i = 0; i < inBlockDataLen; i++ ) {
  240.     //        if ( ((unsigned char *) *inBlockDataH)[i] != ((unsigned char *) *resHandle)[i] )
  241.     //            theSame = false;
  242.     //    }
  243.     //    if ( theSame ) { ::ReleaseResource( resHandle ); goto out; }
  244.         ::RemoveResource( resHandle );
  245.         ::DisposeHandle ( resHandle );
  246.  
  247.     }
  248.  
  249.     // Create new PREF resource by the preferences PrefRec data.
  250.     resHandle = ::NewHandleClear( inBlockDataLen );
  251.     ThrowIfNil_( resHandle );
  252.  
  253.     if ( resHandle != NULL ) {
  254.  
  255.         ::BlockMoveData( (void *) *inBlockDataH, (void *) *resHandle, inBlockDataLen );
  256.         ::AddResource( resHandle, inPrefResType, inPrefResID, "\p" );
  257.         ::WriteResource( resHandle );
  258.         ::ReleaseResource( resHandle );
  259.     //    ::DisposeHandle( resHandle );
  260.     //    Do not use DisposeHandle to dispose of a handle obtained from the Resource Manager
  261.     //    (for example, by a previous call to GetResource); use ReleaseResource instead.
  262.     //    If, however, you have called DetachResource on a resource handle, you should dispose of
  263.     //    the storage by calling DisposeHandle. Inside Macintosh: Memory,  page 2-34.
  264.  
  265.     } else {
  266.         err = resNotFound;
  267.     }
  268.  
  269.   out:
  270.     ::UseResFile( curResFile );
  271.     CloseResourceFork();
  272.  
  273.     return err;
  274. }
  275.  
  276.  
  277. // end of program
  278.